package com.atguigu.gmall.cart.config;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundListOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.Arrays;

//异常处理器
@Component
public class CartAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
    String cartException = "cart:exception:userIds";
    @Autowired
    StringRedisTemplate redisTemplate;
    //子任务异常处理方法
    //参数1：异常对象   参数2：异步任务方法对象  参数3：方法的实参列表
    @Override
    public void handleUncaughtException(Throwable throwable, Method method, Object... objects) {
        System.out.println(method.getName()+" 执行时出现了异常,原因："
                + throwable.getMessage()+" , params:"+ Arrays.toString(objects));
        //redis中使用List来存储异步失败的userId集合
        //获取userId：为了保证从可变参数列表中正确获取userId参数值，必须修改异步任务方法 第一个参数都是userId
        String userId = objects[0].toString();
        //不能拼接userId的值
        BoundListOperations<String, String> listOps = redisTemplate.boundListOps(cartException);
        //list可以保证添加的userId有序
        listOps.leftPush(userId);

    }
}
